﻿package reglas.entidades {
	
	import motor.colision.*;
	import flash.display.*;
	import flash.events.*;	
	
	import motor.grafico.*;
	import reglas.*;
	
	// Esta entidad representa a los personajes del juego q estar compuestos de varias capas, entre ellas:
	//		-Cuerpo del Motor de Colisiones
	//		-Graficos y/o animaciones
	
	public class Entidad
	{
		static public var DEBUG_VERBOSE:Boolean = false;
		
		protected		var cuerpoFisico:Cuerpo;
		protected 		var grafico:Grafico;
		
		protected 		var nombre:String;// Por una cuenstion de DEBUG.		
		
		/*protected 			var posX:Number;
		protected 			var posY:Number;
		
		protected 			var velX:Number;
		protected 			var velY:Number;*/
		
		
		
		// Las distintas entidades (ej:un avion) haran override de este constructor, con tamaños fijos y
		// animaciones ya establecidas.
		
		public function Entidad (xx:Number, yy:Number, velX:Number, velY:Number, unNombre:String) //La velocidad solo la agrego x cuestiones de DEBUG. C/Entidad tendra esto definido
		{
			cuerpoFisico = crearCuerpo(xx,yy,velX,velY,10,10);			
			grafico = crearGrafico();
			
			if (cuerpoFisico!=null)//ver ComponenteNave
			{
				cuerpoFisico.addEventListener (Cuerpo.EVENTO_COLISION,calcularEfectoColision);			
			}
			
			
			//grafico.addEventListener (Grafico.EVENTO_CLICK,procesarClickGrafico);
			
			nombre=unNombre;
		}

		protected function crearCuerpo(xx:Number, yy:Number, velX:Number, velY:Number,ancho:Number, alto:Number):Cuerpo
		{
			return Cuerpos.getInstancia().crearCuerpoGrupo (xx,yy,velX,velY,ancho,alto,Cuerpos.TIPO_GRUPO_A);
		}

		protected function crearGrafico():Grafico
		{
			return Graficos.getInstancia().crearGraficoTest();
		}
		
		//-----------------------------------------------------------------------------------
		
		
		public function animar()
		{
			/*//if (DEBUG_VERBOSE) trace ("Entidad.animar");
			posX = cuerpoFisico.xReal;
			posY = cuerpoFisico.yReal;
			velX = cuerpoFisico.vx;
			velY = cuerpoFisico.vy;
			//----
			grafico.setCoord(posX,posY);*/
			
			//Las coordenadas seran transmitadas solamente cuando se dispare un cambio de estado, 
			//cada Observer de la entidad se le pasara el nuevo estado, coord y velocidad del cuerpo
			//y sabra como manejar las coordenadas entre cada cambio de estado. En el caso de los graficos
			//estos tienen su propio timer y pueden interpolar lo q pasa entre cada cambio de estado.
			
			//Animar se dejara definido como un lugar para el procesamiento de algunas funciones futuras.
		}
		
		public function calcularEfectoColision (e:Event)
		{
			//TODO
			/*trace ("TODO: Entidad.calcularEfectoColision!");
			
			var colisionMenor:Colision = Cuerpos.getInstancia().colisionMenor();
			var ultimaC:Colision = Universo.getInstancia().ultimaColision;
			
			if (Universo.getInstancia().ultimaColision!=null)
			{
				if (colisionMenor.igual(ultimaC))
				{
					trace ("ESTA COLISION YA FUE PROCESADA!");
					return 0;
				}
			}		*/
			
			//trace ("cm.tiempoColision=" + colisionMenor.tiempoColision);
//			trace ("cm.tiempoColision=" + colisionMenor.cuerpo1);
//			trace ("cm.tiempoColision=" + colisionMenor.cuerpo2);
			
			
			//Universo.getInstancia().ultimaColision = colisionMenor;
			trace("Entidad.Colision!");
			destroy();
			
			return 0;
		}
		
		public function destroy ()//LA DESTRUCCION ELIMINA LA ENTIDAD DEL DICC. SI LA OTRA ENTIDAD
									// COLISIONANTE NECESITA CONSULTARLA, ESTO DARA ERROR!!!<<<<<<<<<<<<
		{
			//TODO: Eliminar los listener.
			
			//cuerpo.removeEventListener (Cuerpo.EVENTO_COLISION,calcularEfectoColision);			
			//grafico.removeEventListener (Grafico.EVENTO_CLICK,procesarClickGrafico);
			
			Cuerpos.getInstancia().destroyCuerpoGrupo(cuerpoFisico);			
			Universo.getInstancia().destroyEntidad(this);
		}
		
		public function getNombre ():String
		{
			return nombre;
		}
		
	}
}